package net.chasing.retrofit;

import android.text.TextUtils;

import net.chasing.retrofit.util.JsonConverterFactory;
import net.chasing.retrofit.util.LoggerInterceptor;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;

/**
 * Retrofit管理类
 */
public class RetrofitManager {

    // region 基础设置
    // 测试：
    public static String IP = "https://xxxxxxxxx/";
    // 正式：
//    public static String IP = "https://xxxxxxxxx/"; // todo 发布前检测是否正式IP
    // endregion

    public boolean isPublish() {
        return IP.equals("https://api.tuzinote.com/");
    }

    // region 其它固定
    private static final RetrofitManager retrofitManage = new RetrofitManager();
    private Retrofit mRetrofit;

    private RetrofitManager() {
        init();
    }

    private void init() {
        mRetrofit = new Retrofit.Builder()
                .client(getHttpClient())
                .baseUrl(IP)
                .addConverterFactory(JsonConverterFactory.create())  //它是一个Json数据转化类
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())  //这个类是为了与RxJava衔接而提供的
                .build();
    }

    public static RetrofitManager getInstance() {
        return retrofitManage;
    }

    public <T> T createRetrofitService(Class<T> clazz) {
        return mRetrofit.create(clazz);
    }

    private OkHttpClient getHttpClient() {
        //OkHttp 提供了对用户认证的支持。当 HTTP 响应的状态代码是 401 时，
        // OkHttp 会从设置的 Authenticator 对象中获取到新的 Request 对象并再次尝试发出请求。
        // Authenticator 接口中的 authenticate 方法用来提供进行认证的 Request 对象.
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
//                .authenticator(mAuthenticator)                  //设置请求头token刷新（token过时时进行刷新）
//                .retryOnConnectionFailure(true)                   //设置出现错误进行重新连接，通过RxUtil的retry进行设置重连次数
                .connectTimeout(60, TimeUnit.SECONDS)           //添加超时
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(60, TimeUnit.SECONDS);
//                .addNetworkInterceptor(new EncryptionInterceptor());//添加拦截器，加密
//                .hostnameVerifier(new HostnameVerifier() {
//                    @Override
//                    public boolean verify(String hostname, SSLSession session) {
//                        return false;
//                    }
//                })
        // todo 注意：下载文件的时候，LoggerInterceptor会导致数据加载到内存，造成OOM，正式环境一定要关闭
        builder.addInterceptor(new LoggerInterceptor());
        return builder.build();
    }
    // endregion


    // 添加ip前缀
    // https://api1.tuzinote.com/data/user/0/com.superrabbit.notes/files/120/
    public static String addIpPrefix(String url) {
        if (TextUtils.isEmpty(url))
            return url;
        if (url.startsWith("file://") || url.startsWith("/storage/emulated/0") || url.startsWith("/data/user/0"))
            return url;
        if (url.startsWith("http:") || url.startsWith("https:"))
            return url;
        if (url.startsWith("/") || url.startsWith("\\"))
            url = url.substring(1);
        return IP + url;
    }
}
